﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
using Dados.RHWS;
using System.Globalization;

namespace Financeiro.Dados
{
    public class FolhaPagamentoDAO
    {

        private static string connectionSettings = ConfigurationManager.ConnectionStrings["ERP_FinanceiroConnectionString"].ConnectionString;

        // webservice
        private static RH_Servico servicoRH = new RH_Servico();

       // mostra as folhas de pagamento de um mes anterior
        public static DataTable buscarFolhaDAO(int mes, int ano)
        {
            try
            {
               // faz um select no banco de todos os pagamentos feitos para o mes e ano pedidos
                
                SqlConnection Conn = new SqlConnection(connectionSettings);
                Conn.Open();
                SqlCommand cmd = new SqlCommand("SELECT * FROM Pagamentos WHERE mes=@mes AND ano=@ano", Conn);
                cmd.Parameters.Add("@mes", SqlDbType.Int);
                cmd.Parameters["@mes"].Value = mes;
                cmd.Parameters.Add("@ano", SqlDbType.Int);
                cmd.Parameters["@ano"].Value = ano;

                SqlDataAdapter da = new SqlDataAdapter(cmd);

                DataSet ds = new DataSet();
                da.Fill(ds, "Pagamentos");
            
                Conn.Close();

                DataTable dt = ds.Tables["Pagamentos"];


                return dt;
            }
            catch (Exception ex)
            {
                throw new Exception("Ocorreu um erro no método BuscarFolhaDAO: " + ex.Message);
            }

        }

        // busca pagamentos realizados a um funcionario
        public static DataTable buscarPagamentosFuncionario(int codigoFuncionario, int mes, int ano)
        {
            try
            {
                // faz um select no banco para verificar se o funcionario foi pago para aquele mes e ano
                bool pago = false;

                SqlConnection Conn = new SqlConnection(connectionSettings);
                Conn.Open();
                SqlCommand cmd = new SqlCommand("SELECT count(*) FROM Pagamentos WHERE codFuncionario = @codigo AND mes=@mes AND ano=@ano", Conn);

                cmd.Parameters.Add("@codigo", SqlDbType.Int);
                cmd.Parameters["@codigo"].Value = codigoFuncionario;
                cmd.Parameters.Add("@mes", SqlDbType.Int);
                cmd.Parameters["@mes"].Value = mes;
                cmd.Parameters.Add("@ano", SqlDbType.Int);
                cmd.Parameters["@ano"].Value = ano;

                if (!(cmd.ExecuteScalar() is DBNull))
                {
                    if ((int)cmd.ExecuteScalar() > 0)
                    {
                        pago = true;
                    }
                }

                Conn.Close();
                
             
                // o holerite só deve ter pagamentos já efetuados
                if (pago)
                {
                    DataSet dsPagamentos = servicoRH.buscaPagamentos(codigoFuncionario, mes, ano);

                    // retorna o DataTable com os dados
                    return dsPagamentos.Tables[0];
                }


                // retorna null para os casos em que nenhum pagamento foi feito para aquele período
                return null;
            }
            catch (Exception ex)
            {
                throw new Exception("Ocorreu um erro no método buscarPagamentosFuncionario: " + ex.Message);
            }

        }


        // Gera a folha de um pagamento do mes.
        public static bool gerouFolhaDAO(int mes, int ano)
        {
            try
            {
                // retorna false se não for pra gerarNovamente
                bool resultado = false;
                
                // faz um select no banco de todos os pagamentos feitos para o mes e ano pedidos

                SqlConnection Conn = new SqlConnection(connectionSettings);
                Conn.Open();
                SqlCommand cmd = new SqlCommand("SELECT count(*) FROM Pagamentos WHERE mes=@mes AND ano=@ano", Conn);
                cmd.Parameters.Add("@mes", SqlDbType.Int);
                cmd.Parameters["@mes"].Value = mes;
                cmd.Parameters.Add("@ano", SqlDbType.Int);
                cmd.Parameters["@ano"].Value = ano;

                if (!(cmd.ExecuteScalar() is DBNull))
                {
                    if ((int)cmd.ExecuteScalar() > 0)
                    {
                        resultado = false;
                    }
                    else
                    {
                        resultado = true;
                    }
                }

                Conn.Close();

                return resultado;
            }



            catch (Exception ex)
            {
                throw new Exception("Ocorreu um erro no método gerouFolhaDAO: " + ex.Message);
            }

        }


        // Gera a folha de um pagamento do mes.
        public static void gerarFolha(int mes, int ano)
        {
            try
            {
                // acessa o webservice e pede os dados
                DataSet ds = servicoRH.buscaFolhaPagamento(mes, ano);
                    
                DataTable dt = ds.Tables[0];

                SqlConnection Conn = new SqlConnection(connectionSettings);
                Conn.Open();

                CultureInfo culture = new CultureInfo("pt-BR");

                // insere no banco de dados
                foreach (DataRow dr in dt.Rows)
                {
                    int codigo = Convert.ToInt32(dr[0].ToString());
                    string nome = dr[1].ToString();
                    double valorHora = Convert.ToDouble(dr[2].ToString(), culture);
                    double valorHoraExtra = Convert.ToDouble(dr[3].ToString(), culture);
                    double horasTrabalhadas = Convert.ToDouble(dr[4].ToString(),culture);
                    double horasExtra = Convert.ToDouble(dr[5].ToString(),culture);
                    double beneficios = Math.Round(Convert.ToDouble(dr[6], culture),2);
                 

                    double salario = Math.Round(valorHora * horasTrabalhadas, 2);
                    double salarioExtra = Math.Round(valorHoraExtra * horasExtra, 2);
                    double total = Math.Round(salario + salarioExtra + beneficios);

                    SqlCommand cmd = new SqlCommand(@"Insert into Pagamentos(codFuncionario, salario, salarioExtra, beneficios, mes, ano, dataPagamento, total, nome) 
                                                                            VALUES (@codigo, @salario, @salarioExtra, @beneficios, @mes, @ano, @dataPagamento, @total, @nome)", Conn);

                    if (ContasDAO.insertConta(total, "Pagamento do funcionario " + nome, DateTime.Now, DateTime.Now.AddDays(1), 0, 1) != 0)
                    {
                        cmd.Parameters.Add("@codigo", SqlDbType.Int);
                        cmd.Parameters["@codigo"].Value = codigo;

                        cmd.Parameters.Add("@nome", SqlDbType.VarChar);
                        cmd.Parameters["@nome"].Value = nome;

                        cmd.Parameters.Add("@salario", SqlDbType.Float);
                        cmd.Parameters["@salario"].Value = salario;

                        cmd.Parameters.Add("@salarioExtra", SqlDbType.Float);
                        cmd.Parameters["@salarioExtra"].Value = salarioExtra;

                        cmd.Parameters.Add("@beneficios", SqlDbType.Float);
                        cmd.Parameters["@beneficios"].Value = beneficios;

                        cmd.Parameters.Add("@total", SqlDbType.Float);
                        cmd.Parameters["@total"].Value = total;


                        cmd.Parameters.Add("@dataPagamento", SqlDbType.Date);
                        cmd.Parameters["@dataPagamento"].Value = DateTime.Now.Date;

                        cmd.Parameters.Add("@mes", SqlDbType.Int);
                        cmd.Parameters["@mes"].Value = mes;

                        cmd.Parameters.Add("@ano", SqlDbType.Int);
                        cmd.Parameters["@ano"].Value = ano;

                        cmd.ExecuteNonQuery();
                    }

                }

                Conn.Close();
            }

            catch (Exception ex)
            {
                throw new Exception("Ocorreu um erro no método gerarFolha: " + ex.Message);
            }

        }


        // Gera a folha de um pagamento do mes.
        public static DataTable buscarBeneficios(int codFunc, int mes, int ano)
        {
            try
            {
                // acessa o webservice e pede os dados
                DataSet ds = servicoRH.buscaBeneficio(codFunc, mes, ano);

                DataTable dt = ds.Tables[0];

                return dt;
            }
            catch (Exception ex)
            {
                throw new Exception("Ocorreu um erro no método gerarFolha: " + ex.Message);
            }

        }


    }
}







